package _04_Stream;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 转换算子
 * 
 * filter : 对元素进行过滤筛选,不符合条件的就不要了
 * 
 * skip : 跳过一个元素,原来是 abca 现在是 bca
 * 
 * @author lenovo
 * @date 2020年7月28日 @time 上午11:48:55
 */
public class _02_Stream {

	public static void main(String[] args) {
		List<String> strings = Arrays.asList("a", "b", "c", "a");
		Stream<String> stream = strings.stream();
		System.out.println(strings);

		/**
		 * filter : 对元素进行过滤筛选,不符合条件的就不要了
		 */
		// collect 把stream 转换为集合,属于动作算子,因为不使用动作算子,这些转换算子是不会执行的
		List<String> value = stream.filter(x -> x.equals("a")).collect(Collectors.toList());
		// 只有a
		System.out.println(value);

		// 使用之后,必须重新生成 stream ,不能使用原来的stream
		// 因为转换算子的返回值是一个新的 stream,所以可以链式调用,因为新的stream 还没有进行过操作
		// 否则报错, java.lang.IllegalStateException: stream has already been operated
		// uponor closed
		// 意思是流已操作或关闭

		stream = strings.stream();

		/**
		 * skip : 跳过 1 个元素,原来是 abca 现在是 bca
		 */
		value = stream.skip(1).collect(Collectors.toList());
		System.out.println(value);

		/**
		 * map : 在遍历集合的时候,对元素的操作,比如判断是否是 a ,返回 boolean 类型
		 * 
		 * 因为 map 的返回值,就是新集合中的元素,所以也可以在遍历的时候对集合的数据进行更改,比如都加 --
		 */
		// 使用之后,必须重新生成stream
		stream = strings.stream();
		List<Boolean> value1 = stream.map(x -> x.equals("a")).collect(Collectors.toList());
		System.out.println(value1);
//		[true, false, false, true]

		stream = strings.stream();
		value = stream.map(x -> x + "--").collect(Collectors.toList());
		System.out.println(value);

		/**
		 * distinct : 去掉重复
		 */
		// 使用之前,必须重新生成 stream
		stream = strings.stream();
		value = stream.distinct().collect(Collectors.toList());
		System.out.println(value);

		/**
		 * limit : 取一个集合的前几条数据
		 */
		// 使用之前,必须重新生成stream
		stream = strings.stream();
		value = stream.limit(2).collect(Collectors.toList());
		System.out.println(value);
	}

}
